import axios from 'axios';
import { ElMessage } from 'element-plus';
import { refreshAuthInfo, clearAuthInfo } from '../utils/auth.js';

// 创建axios实例
const api = axios.create({
  baseURL: '/api', // 基础URL
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  },
  withCredentials: true // 允许携带cookie
});

// 请求拦截器
api.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    const token = localStorage.getItem('userToken') || sessionStorage.getItem('userToken');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 响应拦截器
api.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    return response.data;
  },
  error => {
    // 对响应错误做点什么
    if (error.response) {
      // 服务器返回了错误状态码
      switch (error.response.status) {
        case 401:
          // 未授权，清除token并跳转到登录页
          localStorage.removeItem('userToken');
          sessionStorage.removeItem('userToken');
          window.location.href = '/login';
          break;
        case 403:
          ElMessage.error('权限不足，请联系管理员');
          break;
        case 404:
          ElMessage.error('请求的资源不存在');
          break;
        case 500:
          ElMessage.error('服务器内部错误');
          break;
        default:
          ElMessage.error(error.response.data.message || '请求失败');
      }
    } else if (error.request) {
      // 请求发出但没有收到响应
      ElMessage.error('网络错误，请检查网络连接');
    } else {
      // 设置请求时发生错误
      ElMessage.error('请求配置错误');
    }
    return Promise.reject(error);
  }
);

// 认证相关API接口
export const authAPI = {
  // 登录接口
  login: async (loginData) => {
    try {
      console.log('authAPI.login called with:', loginData);
      const response = await api.post('/auth/login', loginData);
      console.log('authAPI.login response received:', response);
      // 处理登录成功响应
      if (response.code === 200 && response.data) {
        // 保存所有认证信息到本地存储
        const rememberMe = loginData.rememberMe || false;
        refreshAuthInfo(response.data, rememberMe);
      }
      return response;
    } catch (error) {
      console.error('登录失败:', error);
      console.error('Error config:', error.config);
      console.error('Error response:', error.response);
      throw error;
    }
  },

  // 注册接口
  register: async (registerData) => {
    try {
      const response = await api.post('/auth/register', registerData);
      // 直接返回响应，不进行自动登录操作
      return response;
    } catch (error) {
      console.error('注册失败:', error);
      throw error;
    }
  },

  // 获取当前用户信息
  getCurrentUser: async () => {
    try {
      const response = await api.get('/auth/current-user');
      return response;
    } catch (error) {
      console.error('获取用户信息失败:', error);
      throw error;
    }
  },

  // 登出功能 - 前端直接处理，不调用后端接口
  logout: () => {
    // 清除所有认证信息
    clearAuthInfo();
    // 跳转到登录页面
    window.location.href = '/login';
  },

  // 发送验证码
  sendVerificationCode: async (phone) => {
    try {
      const response = await api.post('/auth/send-code', { phone });
      return response;
    } catch (error) {
      console.error('发送验证码失败:', error);
      throw error;
    }
  },

  // 获取当前用户详细信息 (127.0.0.1:8088/api/auth/me)
  getMe: async () => {
    try {
      // 创建一个新的axios实例，确保直接调用指定的后端接口
      const meApi = axios.create({
        timeout: 10000,
        withCredentials: true
      });
      
      // 设置请求头
      const token = localStorage.getItem('userToken') || sessionStorage.getItem('userToken');
      
      // 直接指定完整URL以确保正确调用后端接口
      const response = await meApi.get('http://127.0.0.1:8088/api/auth/me', {
        headers: {
          'Authorization': `Bearer ${token}`,
          'Content-Type': 'application/json'
        }
      });
      return response.data;
    } catch (error) {
      console.error('获取用户详细信息失败:', error);
      throw error;
    }
  },

  // 重置密码
  resetPassword: async (resetData) => {
    try {
      const response = await api.post('/auth/reset-password', resetData);
      return response;
    } catch (error) {
      console.error('重置密码失败:', error);
      throw error;
    }
  }
};

// 保持默认导出api实例，兼容可能的其他用法
export default api;